﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Data.SqlClient;
using System.Data;
using Base_de_Datos;
using Base_de_Datos.Excepciones;

namespace ConexiónBD
{
    public class ConexionBD
    {

        private static String _conexionBD = ConfigurationManager.ConnectionStrings[BD_Recursos.conexionBD].ToString();
        private static SqlConnection _conexionSql;
        private static SqlDataReader _reader;

        //<summary>
        //Conexión de la BD
        //</summary>
        public static void Conectar()
        {
            try
            {
                _conexionSql = new SqlConnection(_conexionBD);
                _conexionSql.Open();
            }
            
            catch (SqlException e)
            {
                 throw new ExcepcionEjecucionBD (BD_Recursos.ErrorSqlExceptionConectar, e);
            }
            catch (InvalidOperationException e)
            {
                throw new ExcepcionEjecucionBD (BD_Recursos.ErrorInvalidOperationExceptionConectar, e);
            }
            catch (Exception e)
            {

                throw new ExcepcionEjecucionBD (BD_Recursos.ErrorException, e);
            }

        }

        //<summary>
        //Desconexión de la BD
        //</summary>
        public static void Desconectar()
        {
            try
            {
                _conexionSql.Close();
            }
            catch (Exception)
            {

                throw;
            }

        }

        //<summary>
        //Ejecución de SP con Parámetros 
        //</summary>
        public static SqlDataReader EjecutarStoreProcedureConParametros(String storeProcedure, String[,] parametro, int numeroParametros)
        {
            try
            {
                SqlCommand comando;
                comando = _conexionSql.CreateCommand();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = storeProcedure;
                int j = numeroParametros;

                for (int i = 0; i < j; i++)
                {
                    comando.Parameters.AddWithValue(parametro[0, i], parametro[1, i]);
                }

                _reader = comando.ExecuteReader();
                return _reader;
            }
            catch (SqlException e)
            {
                throw new ExcepcionEjecucionBD (BD_Recursos.ErrorSqlExceptionSP, e);
            }
            catch (InvalidOperationException e)
            {
                 throw new ExcepcionEjecucionBD (BD_Recursos.ErrorInvalidOperationExceptionSP, e);
            }
            catch (Exception e)
            {
                throw new ExcepcionEjecucionBD(BD_Recursos.ErrorException, e);
            }
        }

        //<summary>
        //Ejecución de Store Procedure sin parámetros 
        //</summary>
        public static SqlDataReader EjecutarStoreProcedure(String storeProcedure)
        {
            try
            {
                SqlCommand comando;
                comando = _conexionSql.CreateCommand();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = storeProcedure;
                _reader = comando.ExecuteReader();
                return _reader;
            }
            catch (SqlException e)
            {
                throw new ExcepcionEjecucionBD(BD_Recursos.ErrorSqlExceptionSP, e);
            }
            catch (InvalidOperationException e)
            {
                throw new ExcepcionEjecucionBD(BD_Recursos.ErrorInvalidOperationExceptionSP, e);
            }
            catch (Exception e)
            {
                throw new ExcepcionEjecucionBD(BD_Recursos.ErrorException, e);
            }
        }
    }
}